using UnityEngine;

public class LocalToWorldMatrixExample2 : MonoBehaviour
{
    public Transform 本地坐标系带位移;
    public Transform 本地坐标系带位移下的物体;

    void OnGUI()
    {
        GUILayout.Label($"本地坐标系(带位移) world position: {本地坐标系带位移.position.ToString("F2")}");
        GUILayout.Label($"本地坐标系(带位移) local position: {本地坐标系带位移.localPosition.ToString("F2")}");
        GUILayout.Label($"本地坐标系(带位移) world rotation: {本地坐标系带位移.rotation.ToString("F2")}");
        GUILayout.Label($"本地坐标系(带位移) local rotation: {本地坐标系带位移.localRotation.ToString("F2")}");
        GUILayout.Label($"本地坐标系(带位移)下的物体 world position: {本地坐标系带位移下的物体.position.ToString("F2")}");
        GUILayout.Label($"本地坐标系(带位移)下的物体 local position: {本地坐标系带位移下的物体.localPosition.ToString("F2")}");
        GUILayout.Label($"本地坐标系(带位移)下的物体 world rotation: {本地坐标系带位移下的物体.rotation.ToString("F2")}");
        GUILayout.Label($"本地坐标系(带位移)下的物体 local rotation: {本地坐标系带位移下的物体.localRotation.ToString("F2")}");
        GUILayout.Label("================================");

        GUILayout.Label(
            $"localToWorldMatrix.inverse == worldToLocalMatrix : {本地坐标系带位移.localToWorldMatrix.inverse == 本地坐标系带位移.worldToLocalMatrix}");
        GUILayout.Label("================================");

        var testVector4 = 本地坐标系带位移.localToWorldMatrix * 本地坐标系带位移下的物体.localPosition;
        GUILayout.Label($"本地坐标系.localToWorldMatrix * 本地坐标系下的物体.localPosition : {testVector4.ToString("F2")}");
        GUILayout.Label("说明：本地坐标系.localToWorldMatrix * Vector3 的结果为 Vector3 在世界坐标下的值");
        GUILayout.Label(
            $"上述结果 + 本地坐标系.position 为 本地坐标系下的物体.position : {(new Vector3(testVector4.x, testVector4.y, testVector4.z) + 本地坐标系带位移.position).ToString("F2")}");
        GUILayout.Label("将 Vector3 变为 new Vector4(Vector3, 1) 才能在转换中带上 本地坐标系位移 :");
        testVector4 = new Vector4(本地坐标系带位移下的物体.localPosition.x, 本地坐标系带位移下的物体.localPosition.y, 本地坐标系带位移下的物体.localPosition.z, 1);
        testVector4 = 本地坐标系带位移.localToWorldMatrix * testVector4;
        GUILayout.Label($"本地坐标系带位移.localToWorldMatrix * new Vector4(本地坐标系带位移下的物体.localPosition, 1) : {testVector4.ToString("F2")}");

        GUILayout.Label("================================");

        var testVector3 = 本地坐标系带位移下的物体.position - 本地坐标系带位移.position;
        GUILayout.Label($"本地坐标系下的物体 相对于 本地坐标系 在 世界坐标系下的位移 :");
        GUILayout.Label($"本地坐标系下的物体.position - 本地坐标系.position : {testVector3.ToString("F2")}");
        GUILayout.Label($"本地坐标系.worldToLocalMatrix * 该位移 : {(本地坐标系带位移.worldToLocalMatrix * testVector3).ToString("F2")}");
        GUILayout.Label($"上述结果 即为 本地坐标系下的物体 相对 本地坐标系 的 localPosition");
        GUILayout.Label("================================");
    }
}